// 所有权与结构体学习

struct Counter {
    numer: i32,
}

impl Counter {
    fn new(numer: i32) -> Self {
        Self { numer }
    }

    // 不可变借用 Counter::get_numer(self:: &Self)
    fn get_numer(& self) -> i32 {
        self.numer
    }

    // 可变借用 Counter::add_number(self::mut &Self, increment:i32)
    fn add_numer(& mut self, increment: i32) {
        self.numer += increment;
    }

    // move 使用非引用的self之后，外部变量会丧失所有权
    fn give_up(self) {
        println!("free: {}", self.numer);
    }

    // move 使用非引用的self之后，外部变量会丧失所有权
    fn combine(c1: Self, c2: Self) -> Self {
        Self {
            numer: c1.numer + c2.numer,
        }
    }
}

pub fn study() {
    let mut c1 = Counter::new(10);
    println!("当前的num：{}", c1.get_numer());
    println!("当前的num：{}", c1.get_numer());
    c1.add_numer(20);
    println!("当前的num：{}", c1.get_numer()); // 还能拿到所有权
    // c1.give_up();
    // println!("当前的num：{}", c1.get_numer()); // 执行give_up方法之后，所有权已经丧失了

    let c2 = Counter::new(50);
    let c3 = Counter::combine(c1, c2);
    println!("当前的num：{}", c3.get_numer());
}
